Batchnormgrad ================= 逐元素计算加法梯度 计算批标准化 (Batch Normalization) 的梯度。 该算子计算损失函数 L 分别对输入 `x`、缩放因子 `scale` (γ) 和偏置 `bias` (β) 的梯度。其中 `bias` 的梯度为 `dbias`。 .. math:: dscale(\gamma) &= \sum_{i=1}^{m} dy_i \cdot \hat{x}_i \\ dbias(\beta) &= \sum_{i=1}^{m} dy_i .. math:: dx_i = \frac{\gamma}{m\sqrt{\sigma^2 + \epsilon}} \left[ m \cdot dy_i - \sum_{j=1}^{m}dy_j - \hat{x}_i \sum_{j=1}^{m}dy_j \hat{x}_j \right] 其中 :math:`m` 是批处理大小 (batch),:math:`\hat{x}` 是归一化后的 :math:`x`。 输入: - **x** - 前向传播时的输入张量。 - **dy** - 来自后一层的上游梯度。 - **mean** - 前向传播时计算的均值。 - **invar** - 前向传播时计算的逆方差 (1 / sqrt(variance + epsilon))。 - **scale** - 前向传播时使用的缩放因子 (gamma, γ)。 - **batch** - 批处理大小。 - **channel** - 通道数。 - **is_train** - 是否为训练模式。梯度计算通常在训练时进行。 - **core_mask** - 核掩码。 输出: - **dx** - 对输入 `x` 的梯度。 - **dbias** - 对偏置 `bias` (β) 的梯度。 - **dscale** - 对缩放因子 `scale` (γ) 的梯度。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持fp32 - MT7004 支持fp16, fp32 **共享存储版本:** .. c:function:: void fp_batchnormgrad_s(float* x, float* dy, float* mean, float* invar, float* scale, int batch, int channel, int is_train, float* dx, float* dbias, float* dscale, int core_mask) .. c:function:: void hp_batchnormgrad_s(half* x, half* dy, half* mean, half* invar, half* scale, int batch, int channel, int is_train, half* dx, half* dbias, half* dscale, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 20 //FT78NE示例 #include #include int main(int argc, char* argv[]) { float *x = (float *)0xA0000000; // forward input x float *dy = (float *)0xB0000000; // upstream gradient dy float *mean = (float *)0xC0000000; // forward mean float *invar = (float *)0xD0000000; // forward inverse variance float *scale = (float *)0xE0000000; // forward scale (gamma) float *dx = (float *)0xA1000000; // output gradient dx float *dbias = (float *)0xB1000000; // output gradient dbias float *dscale = (float *)0xC1000000; // output gradient dscale int batch = 4; int channel = 64; int is_train = true; int core_mask = 0xff; fp_batchnormgrad_s(x, dy, mean, invar, scale, batch, channel, is_train, dx, dbias, dscale, core_mask); return 0; } **私有存储版本:** .. c:function:: void fp_batchnormgrad_p(float* x, float* dy, float* mean, float* invar, float* scale, int batch, int channel, int is_train, float* dx, float* dbias, float* dscale) .. c:function:: void hp_batchnormgrad_p(half* x, half* dy, half* mean, half* invar, half* scale, int batch, int channel, int is_train, half* dx, half* dbias, half* dscale) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 19 //FT78NE示例 #include #include int main(int argc, char* argv[]) { float *x = (float *)0x10000000; // forward input x in L2 space float *dy = (float *)0x10100000; // upstream gradient dy float *mean = (float *)0x10200000; // forward mean float *invar = (float *)0x10300000; // forward inverse variance float *scale = (float *)0x10400000; // forward scale (gamma) float *dx = (float *)0x10500000; // output gradient dx float *dbias = (float *)0x10600000; // output gradient dbias float *dscale = (float *)0x10700000; // output gradient dscale int batch = 4; int channel = 32; int is_train = true; fp_batchnormgrad_p(x, dy, mean, invar, scale, batch, channel, is_train, dx, dbias, dscale); return 0; }